package tsb.util;

import java.util.regex.Pattern;

/**
 *
 * Metodos para comparar cadenas
 */
public abstract class StrCmp {
    private static final int IGUAL = 0;
    private static final int MENOS = 1;
    private static final int MAS   = 2;

    public static boolean soloTextoGuionesYEspacios(final String aValidar) {
        boolean resultado = true;
        String[] modificar = aValidar.split(" ");

        for (int i = 0; i < modificar.length; i++) {
            String aux = modificar[i].trim();
            resultado = resultado && StrCmp.soloTextosYGuiones(aux);
        }
        return resultado;
    }

    public static boolean soloTextosYGuiones(final String aValidar) {
        return StrCmp.validarCaracteres(aValidar, "^[A-Za-z0-9_\\-]+$");
    }
    
    public static boolean hasOnlyAlphaNum(final String aValidar) {
        return StrCmp.validarCaracteres(aValidar, "^[A-Za-z0-9]+$");
    }

    public static boolean validarNombreTag(final String str, final String sInicio, final String sFinal) {
        String aux=StrOp.borrarInicioFin(str, sInicio, sFinal).split(" ")[0];
        return StrCmp.soloTextosYGuiones(aux);
    }

    private static boolean validarCaracteres(final String aValidar, final String caracteres) {
        Pattern p = Pattern.compile(caracteres);
        return p.matcher(aValidar).matches();
    }

    public static boolean esInicioFin(final String str, final String sInicio, final String sFinal) {
        return (str.startsWith(sInicio) && str.endsWith(sFinal));
    }

    public static boolean tieneMasDe(final String str, final String ch, final int valor, final boolean ignorar) {
        return StrCmp.evaluar(str, ch, valor, ignorar, StrCmp.MAS);
    }

    public static boolean isEmpty(final String str, final String sInicio, final String sFinal) {
        return StrOp.borrarInicioFin(str, sInicio, sFinal).equals("");
    }

    public static boolean tieneMenosDe(final String str, final String ch, final int valor, final boolean ignorar) {
        return StrCmp.evaluar(str, ch, valor, ignorar, StrCmp.MENOS);
    }

    public static boolean tieneIgualDe(final String str, final String ch, final int valor, final boolean ingnorar) {
        return StrCmp.evaluar(str, ch, valor, ingnorar, StrCmp.IGUAL);
    }

    private static boolean evaluar(final String str, final String ch, final int valor, final boolean ignorar, final int tipo) {
        boolean resultado = true;
        int[] array = StrCmp.getCantidadDeCaracteresSalida(str, ch, ignorar);

        for (int i = 0; i < array.length; i++) {
            int j = array[i];

            switch (tipo) {
                case StrCmp.IGUAL:
                    resultado = resultado && (j == valor);
                    break;
                case StrCmp.MENOS:
                    resultado = resultado && (j < valor);
                    break;
                case StrCmp.MAS:
                    resultado = resultado && (j > valor);
                    break;
                default:
                    break;
            }
        }
        return resultado;
    }

    private static int[] getCantidadDeCaracteresSalida(final String str, final String ch, final boolean ignorar) {
        int[] resultado = new int[ch.length()];
        char[] array = null;
        String aux = null;

        if (ignorar) {
            aux = str.toLowerCase();
            array = ch.toLowerCase().toCharArray();
        }
        else {
            array = ch.toCharArray();
            aux = str;
        }

        for (int i = 0; i < array.length; i++) {
            char c = array[i];
            resultado[i] = StrCmp.getCantidadDeSalidas(aux, c);
        }
        return resultado;
    }
    
    private static int getCantidadDeSalidas(final String str, char ch) {
        char[] array = str.toCharArray();
        boolean bAux = false;
        int cont = 0;

        for (int i = 0; i < array.length; i++) {
            if (array[i] == '"') {
                bAux = !bAux;
            }
            if (array[i] == ch && bAux == false) {
                cont++;
            }
        }
        return cont;
    }
}
